/**
 * jQuery jfUI (menu 弹出菜单)
 * 
 * @author yepp(叶平平)
 * @date 2012-11-19
 * 
 * ***/
 ;(function($){
 	
 	$.jfMenu = function(options){
 		return $.jfui.run.call(this,'jfMenu',arguments);
 	};
 	
 	$.jfDefaults.Menu = {
 		width : 120,
 		top : 0,
 		left : 0,
 		items : null,
 		shadow : true
 	};
 	
 	$.jfMethos.Menu = {};
 	
 	$.jfui.controls.Menu = function(options){
 		$.jfui.controls.Menu.base.constructor.call(this,null,options); 
 	};
 	
 	$.jfui.controls.Menu.jfExtend($.jfui.core.UIComponent,{
 		__getType : function(){
 			return 'Menu';
 		},
 		__idPrev : function(){
 			return 'Menu';
 		},
 		_extendMethods :function(){
 			return $.jfMethos.Menu;
 		},
 		_render : function(){
 			var g = this, p = this.options;
 			g.menuItemCount =0;
 			//全部菜单
 			g.menus = {};
 			//顶级菜单
 			g.menu = g.createMenu();
 			g.element = g.menu[0];
 			g.menu.css({top:p.top,left:p.left,width:p.width});
			
 			p.items && $(p.items).each(function(i,item){
 				g.addItem(item);
 			});
 			
 			$(document).bind('click.menu',function(){
 				for(var menuid in g.menus){
 					var menu = g.menus[menuid];
 					if(!menu){
 						return ;
 					}
 					menu.hide();
 					if(menu.shadow){
 						menu.shadow.hide();
 					}
 				}
 			});
 			g.set(p);
 		},
 		show : function(options,menu){
 			var g=this, p=this.options;
 			if(menu == undefined){
 				menu = g.menu;
 			}
 			if(options && options.left!=undefined){
 				menu.css({left : options.left});
 			}
 			if(options && options.top != undefined){
 				menu.css({top:options.top});
 			}
 			menu.show();
 			g.updateShadow(menu);
 		},
 		updateShadow : function(){
 			var g=this, p=this.options;
 			if(!p.shadow){
 				return;
 			}
 			menu.shadow.css({
 				left : menu.css('left'),
 				top : menu.css('top'),
 				width : menu.outerWidth(),
 				height : menu.outerHeight()
 			});
 			if(menu.is(':visible')){
 				menu.shadow.show();
 			}else{
 				menu.shadow.hide();
 			}
 		},
 		hide : function(menu){
 			var g = this, p=this.options;
 			if(menu == undefined){
 				menu = g.menu;
 			}
 			g.hideAllSubMenu(menu);
 			menu.hide();
 			g.updateShadow(menu);
 		},
 		toggle : function(){
 			var g = this, p= this.options;
 			g.menu.toggle();
 			g.updateShadow(g.menu);
 		},
 		removeItem : function(itemid){
 			var g=this,p=this.options;
 			$("> .l-menu-item[menuitemid=" + itemid + "]", g.menu.items).remove();
 		},
 		setEnabled : function(itemid){
 			var g=this,p=this.options;
 			$("> .l-menu-item[menuitemid=" + itemid + "]", g.menu.items).removeClass("l-menu-item-disable");
 		},
 		setDisabled : function(itemid){
 			var g = this, p=this.options;
 			 $("> .l-menu-item[menuitemid=" + itemid + "]", g.menu.items).addClass("l-menu-item-disable");
 		},
 		isEnable : function(itemid){
 			var g= this, p=this.options;
 			return !$("> .l-menu-item[menuitemid=" + itemid + "]", g.menu.items).hasClass("l-menu-item-disable");
 		},
 		getItemCount:function(){
 			var g=this,p=this.options;
 			return $('> .l-menu-item',g.menu.items).length;
 		},
 		addItem : function(item,menu){
 			var g=this, p=this.options;
 			if(!item){
 				return;
 			}
 			if(menu == undefined){
 				menu = g.menu;
 			}
 			if(item.line){
 				menu.items.append('<div class="l-menu-item-line"></div>');
 				return;
 			}
 			var ditem = $('<div class="l-menu-item"><div class="l-menu-item-text"></div> </div>');
            var itemcount = $("> .l-menu-item", menu.items).length;
            menu.items.append(ditem);
            ditem.attr('jfuimenuitemid',++g.menuItemCount);
            item.id && ditem.attr("menuitemid", item.id);
            item.text && $(">.l-menu-item-text:first", ditem).html(item.text);
            item.icon && ditem.prepend('<div class="l-menu-item-icon l-icon-' + item.icon + '"></div>');
            if(item.disble || item.disabled){
            	ditem.addClass('l-menu-item-disable');
            }
            if(item.children){
            	ditem.append('<div class="l-menu-item-arrow"></div>');
            	var newmenu = g.createMenu(ditem.attr("jfuimenuitemid"));
            	g.menus[ditem.attr('jfuimenuitemid')]= newmenu;
            	newmenu.width(p.width);
            	newmenu.hover(null,function(){
            		if(!newmenu.showedSubMenu){
            			g.hide(newmenu);
            		}
            	});
            	$(item.children).each(function(){
            		g.addItem(this,newmenu);
            	});
            }
            item.click && ditem.click(function(){
            	if($(this).hasClass('l-menu-item-disable')){
            		return;
            	}
            	item.click(item,itemcount);
            });
            item.dbclick && ditem.dblclick(function(){
            	if($(this).hasClass('l-menu-item-disable')){
            		item.dblclick(item,itemcount);
            	}
            });
            var menuover = $("> .l-menu-over:first", menu);
            ditem.hover(function(){
            	if($(this).hasClass('l-menu-item-disable')){
            		return ;
            	}
            	var itemtop = $(this).offset().top;
            	var top = itemtop-menu.offset().top;
            	menuover.css({top:top});
            	g.hideAllSubMenu(menu);
            	if(item.children){
            		var jfuimenuitemid = $(this).attr('jfuimenuitemid');
            		if(!jfuimenuitemid){
            			return;
            		}
            		if(g.menus[jfuimenuitemid]){
            			g.show({top:itemtop,left: $(this).offset().left + $(this).width() - 5 }, g.menus[jfuimenuitemid]);
            			menu.showedSubMenu = true;
            		}
            	}
            },function(){
            	if($(this).hasClass('l-menu-item-disable')){
            		return ;
            	}
            	var jfuimenuitemid = $(this).attr('jfuimenuitemid');
            	if(item.children){
            		var jfuimenuitemid = $(this).attr('jfuimenuitemid');
            		if(!jfuimenuitemid){
            			return;
            		}
            	}
            });
 		},
 		hideAllSubMenu : function(menu){
 			var g=this, p=this.options;
 			if(menu == undefined){
 				menu = g.menu;
 			}
 			 $("> .l-menu-item", menu.items).each(function ()
            {
                if ($("> .l-menu-item-arrow", this).length > 0)
                {
                    var jfuimenuitemid = $(this).attr("jfuimenuitemid");
                    if (!jfuimenuitemid) {
                    	return;
                    }
                    g.menus[jfuimenuitemid] && g.hide(g.menus[jfuimenuitemid]);
                }
            });
             menu.showedSubMenu = false;
 		},
 		creatMenu : function(parentMenuItemID){
 			var g = this, p = this.options;
 			var menu = $('<div class="l-menu" style="display:none"><div class="l-menu-yline"></div><div class="l-menu-over"><div class="l-menu-over-l"></div> <div class="l-menu-over-r"></div></div><div class="l-menu-inner"></div></div>');
 			parentMenuItemID && menu.attr("jfuiparentmenuitemid",parentMenuItemID);
 			menu.items = $("> .l-menu-inner:first", menu);
 			menu.appendTo('body');
 			if(p.shadow){
 				menu.shadow = $('<div class="l-menu-shadow"></div>').insertAfter(menu);
                g.updateShadow(menu);
 			}
 			menu.hover(null, function ()
            {
                if (!menu.showedSubMenu)
                    $("> .l-menu-over:first", menu).css({ top: -24 });
            });
            if(parentMenuItemID){
            	g.menus[parentMenuItemID] = menu;
            }else{
            	 g.menus[0] = menu;
            }
            return menu;
 		}
 	});
 	 //旧写法保留
    $.jfui.controls.Menu.prototype.setEnable = $.jfui.controls.Menu.prototype.setEnabled;
    $.jfui.controls.Menu.prototype.setDisable = $.jfui.controls.Menu.prototype.setDisabled;
 })(jQuery);